10 REM - TOWERS OF HANOI FOR COMMODORE 64 20 REM - DANIEL MILLER 30 REM - 2815 34 STREET 40 REM - ASTORIA, QUEENS 50 REM - NEW YORK, NEW YORK 11103 60 REM - SEPTEMBER 1, 1983 70 REM ******************************** 80 GOTO2150 90 POKE53281,1:ZZ=1:PRINTCL$;LEFT$(DO$,2);TAB(11);HDG$; 100 POKE55587,10:POKE1315,49:POKE55595,10:POKE1323,50:POKE55603,10:POKE1331,51 110 PRINT LEFT$(DO$,20);TAB(5);A$(1);LEFT$(DO$,9);TAB(11);A$(3); 120 PRINTLEFT$(DO$,9);TAB(19);A$(3);LEFT$(DO$,9);TAB(27);A$(3) 130 REM - PLACE SPRITES ON TOWER #1 140 POKEV+14,93:POKEV+15,160:POKEV+12,93:POKEV+13,151:POKEV+10,93:POKEV+11,142 150 POKEV+8,93:POKEV+9,133:POKEV+6,93:POKEV+7,124:POKEV+4,93:POKEV+5,115 160 POKEV+2,93:POKEV+3,106:POKEV+0,93:POKEV+1,97 170 IF YN$="Y" THENN2=8-NUM:GOTO200 180 IF ZZ=0 THEN350 190 PRINTLEFT$(DO$,22);TAB(8);NUM$;:INPUT NUM:N2=8-NUM:SP=0:IF NUM=8 THEN270 200 IF NUM<2 OR NUM>8 THENPRINT LEFT$(DO$,22);TAB(5);SP$;:GOTO190 210 IF NUM=8 AND YN$="Y" THEN270 220 N4=N2 230 FOR X=1 TO N4 240 SP=SP+(2^(N4-1)) 250 N4=N4-1:NEXT X 260 POKEV+21,(255-SP) 270 ZZ=0:FOR TM=1 TO 250:NEXT TM:PRINTLEFT$(DO$,22);TAB(5);SP$; 280 T1$="":T2$="":T3$="":N3=N2+1 290 FOR X=1 TO NUM:T1$=T1$+T4$(X):T2$=T2$+T5$(X):T3$=T3$+T6$(X):NEXT X 300 IF YN$="Y" THEN1430 310 FOR X=1 TO NUM:Y=2^X-1:NEXT X 320 NUM$=RV$+G2$+STR$(NUM)+RO$+SLV$(1)+RV$+G2$+STR$(Y)+SLV$(2):Y0=Y 330 PRINTLEFT$(DO$,22);TAB(6);NUM$;:FOR TM=1 TO 2000:NEXT TM 340 FOR TM=1 TO 250:NEXT TM:PRINTLEFT$(DO$,22);TAB(5);SP$; 350 PRINTLEFT$(DO$,22);TAB(6);F9$;" ";TAB(24);T9$;" "; 360 PRINTLEFT$(DO$,22);TAB(6);F9$;" ";CR$; 370 NUM$="":SLV$(1)="":SLV$(2)="" 380 IF ZA=2 THEN420 390 GET TWR$(1):IF TWR$(1)="" THEN390 400 IF TWR$(1)="[133]" THEN1330:REM - 'F1' 410 IF (TWR$(1)<"1" OR TWR$(1)>"3") THENTWR$(1)="":GOTO390 420 PRINT RV$+RED$+TWR$(1)+RO$; 430 GOSUB520 440 PRINTLEFT$(DO$,22);TAB(34);" ";CR$; 450 IF ZA=2 THEN480 460 GET TWR$(2):IF TWR$(2)="" THEN460 470 IF TWR$(2)<"1" OR TWR$(2)>"3" THENTWR$(2)="":GOTO460 480 PRINT RV$+RED$+TWR$(2)+RO$; 490 IF TWR$(1)<>TWR$(2) THEN510 500 ER$=RV$+RED$+" INVALID ENTRIES"+RO$:GOTO610 510 GOTO640 520 X=1:GOSUB530:RETURN 530 ON VAL(TWR$(X)) GOTO540,560,580 540 IF VAL(T1$)=0 THEN600 550 RETURN 560 IF VAL(T2$)=0 THEN600 570 RETURN 580 IF VAL(T3$)=0 THEN600 590 RETURN 600 ER$=RV$+RED$+"TOWER # "+TWR$(X)+" IS EMPTY"+RO$ 610 FOR Y=1 TO 5:PRINTLEFT$(DO$,24);TAB(12)ER$;:FOR TM=1 TO 250:NEXT TM 620 PRINTLEFT$(DO$,24);TAB(12);LEFT$(SP$,18);:FOR TM=1 TO 250 630 NEXT TM,Y:ER$="":GOTO350 640 ON VAL(TWR$(1)) GOTO650,680,710 650 FOR X=1 TO NUM:IF MID$(T1$,X,1)="1" THEN670 660 NEXT X:LOC(1)=160:GOTO740 670 LOC(1)=T1(N2+X):T4$(N2+X)="0":GOTO740 680 FOR X=1 TO NUM:IF MID$(T2$,X,1)="1" THEN700 690 NEXT X:LOC(1)=160:GOTO740 700 LOC(1)=T2(N2+X):T5$(N2+X)="0":GOTO740 710 FOR X=1 TO NUM:IF MID$(T3$,X,1)="1" THEN730 720 NEXT X:LOC(1)=160:GOTO740 730 LOC(1)=T3(N2+X):T6$(N2+X)="0" 740 LC=LOC(1):GOSUB880:SP(1)=SP 750 ON VAL(TWR$(2)) GOTO760,790,820 760 FOR X=1 TO NUM:IF MID$(T1$,X,1)="1" THEN780 770 NEXT X:LOC(2)=160:T4$(N2+X-1)="1":GOTO850 780 LOC(2)=T1(N2+X-1):T4$(N2+X-1)="1":GOTO850 790 FOR X=1 TO NUM:IF MID$(T2$,X,1)="1" THEN810 800 NEXT X:LOC(2)=160:T5$(N2+X-1)="1":GOTO850 810 LOC(2)=T2(N2+X-1):T5$(N2+X-1)="1":GOTO850 820 FOR X=1 TO NUM:IF MID$(T3$,X,1)="1" THEN840 830 NEXT X:LOC(2)=160:T6$(N2+X-1)="1":GOTO850 840 LOC(2)=T3(N2+X-1):T6$(N2+X-1)="1" 850 LC=LOC(2):GOSUB880:SP(2)=SP 860 T1$="":T2$="":T3$="":N5=N2+1 870 FOR X=N5 TO 8:T1$=T1$+T4$(X):T2$=T2$+T5$(X):T3$=T3$+T6$(X):NEXT X:GOTO960 880 IF LC=97 THENSP=1:RETURN 890 IF LC=106 THENSP=2:RETURN 900 IF LC=115 THENSP=3:RETURN 910 IF LC=124 THENSP=4:RETURN 920 IF LC=133 THENSP=5:RETURN 930 IF LC=142 THENSP=6:RETURN 940 IF LC=151 THENSP=7:RETURN 950 IF LC=160 THENSP=8:RETURN 960 ON VAL(TWR$(1)) GOTO970,980,990 970 SQ%=R1%(1,SP(1)):R1%(1,SP(1))=8:GOTO1000 980 SQ%=R2%(1,SP(1)):R2%(1,SP(1))=8:GOTO1000 990 SQ%=R3%(1,SP(1)):R3%(1,SP(1))=8 1000 ON VAL(TWR$(2)) GOTO1010,1020,1030 1010 R1%(1,SP(2))=SQ%:GOTO1040 1020 R2%(1,SP(2))=SQ%:GOTO1040 1030 R3%(1,SP(2))=SQ% 1040 ON VAL(TWR$(1)) GOTO1050,1060,1070 1050 X1=93:GOTO1080 1060 X1=157:GOTO1080 1070 X1=222 1080 ON VAL(TWR$(2)) GOTO1090,1100,1110 1090 X2=93:GOTO1120 1100 X2=157:GOTO1120 1110 X2=222 1120 REM - MOVE SPRITE 1130 ON SQ%+1 GOTO1140,1150,1160,1170,1180,1190,1200,1210 1140 SP=0:SQ=1:GOTO1220 1150 SP=2:SQ=3:GOTO1220 1160 SP=4:SQ=5:GOTO1220 1170 SP=6:SQ=7:GOTO1220 1180 SP=8:SQ=9:GOTO1220 1190 SP=10:SQ=11:GOTO1220 1200 SP=12:SQ=13:GOTO1220 1210 SP=14:SQ=15 1220 IF VAL(TWR$(1))>VAL(TWR$(2)) THEN1260 1230 FOR YY=LOC(1) TO 55 STEP-1:POKE V+SP,X1:POKE V+SQ,YY:NEXT YY 1240 FOR XX=X1 TO X2:POKE V+SP,XX:POKE V+SQ,55:NEXT XX 1250 FOR YY=55 TO LOC(2):POKE V+SP,X2:POKE V+SQ,YY:NEXT YY:GOTO1290 1260 FOR YY=LOC(1) TO 55 STEP-1:POKE V+SP,X1:POKE V+SQ,YY:NEXT YY 1270 FOR XX=X1 TO X2 STEP-1:POKE V+SP,XX:POKE V+SQ,55:NEXT XX 1280 FOR YY=55 TO LOC(2):POKEV+SP,X2:POKEV+SQ,YY:NEXT YY 1290 MV=MV+1:PRINTLEFT$(DO$,24);TAB(17);MV$+RV$+B2$+STR$(MV)+RO$; 1300 IF ZA=2 THENMW=MW+1:GOTO1440:REM - COMPUTER'S NEXT MOVE 1310 GOTO350:REM - PLAYER'S NEXT MOVE 1320 REM - COMPUTER SOLUTION 1330 TWR$(1)="":PRINTLEFT$(DO$,24);TAB(7);CMP$; 1340 GET YN$:IF YN$="" THEN1340 1350 IF YN$="Y" THEN1370 1360 IF YN$<>"N" THENYN$="":GOTO1330 1370 PRINT RV$+BL$+" "+YN$+RO$;:FOR TM=1 TO 500:NEXT TM:IF YN$="Y" THEN1420 1380 FOR TM=1 TO 1000:NEXT TM 1390 PRINTLEFT$(DO$,24);TAB(7);SP$;LEFT$(DO$,24);TAB(9);EN$; 1400 GET RT$:IF RT$<>CHR$(13) THEN1400 1410 POKE V+21,0:PRINT CL$;:END 1420 SP=0:MV=0:MW=1:GOTO1990 1430 YN$="":ZA=2:PRINTLEFT$(DO$,24);TAB(7);SP$; 1440 BI$="":FOR X=1 TO 8:BI$(X)="0":NEXT X 1450 IF MV=Y0 THEN1380 1460 CT=FRE(0) 1470 C2=0:C3=0:C4=0:C5=0:C6=0:ZA=2 1480 DEC=MW 1490 FOR Y=0 TO 8:IF INT(2^Y)>DEC THENY=Y-1:BI$(Y)="1":GOTO1510 1500 BI$(Y)="0":NEXT Y 1510 DEC=DEC-2^Y:IF DEC=0 THEN1530 1520 GOTO1490 1530 FOR Y=7 TO 0 STEP-1:BI$=BI$+BI$(Y):NEXT Y 1540 FOR X=8 TO 1 STEP-1:IF MID$(BI$,X,1)="0" THENC2=C2+1:NEXT X 1550 C2=C2+1 1560 RI%=C2+NUM-1:ON NUM-1 GOTO1570,1580,1590,1600,1610,1620,1630 1570 RI%=RI%+4:GOTO1640 1580 RI%=RI%+2:GOTO1640 1590 GOTO1640 1600 RI%=RI%-2:GOTO1640 1610 RI%=RI%-4:GOTO1640 1620 RI%=RI%-6:GOTO1640 1630 RI%=ABS(RI%-8) 1640 FOR X=1 TO 8:IF R1%(1,X)=RI% THENTWR$(1)="1":GOTO1670 1650 NEXT X:FOR X=1 TO 8:IF R2%(1,X)=RI% THENTWR$(1)="2":GOTO1670 1660 NEXT X:TWR$(1)="3" 1670 L$=TWR$(1) 1680 FOR X=1 TO 8:IF MID$(BI$,X,1)="1" THENC3=C3+1:NEXT X:GOTO1700 1690 NEXT X 1700 IF C3>1 THEN1740 1710 IF VAL(T1$)=0 THENTWR$(2)="1":GOTO350 1720 IF VAL(T2$)=0 THENTWR$(2)="2":GOTO350 1730 IF VAL(T3$)=0 THENTWR$(2)="3":GOTO350 1740 FOR X=8 TO 1 STEP-1:C4=C4+1:IF MID$(BI$,X,1)="0" THENNEXT X 1750 C6=C4 1760 FOR X=8-C4 TO 1 STEP-1:C6=C6+1:IF MID$(BI$,X,1)="0"THENC5=C5+1:NEXT X 1770 RJ%=C6+NUM-1:ON NUM-1 GOTO1780,1790,1800,1810,1820,1830,1840 1780 RJ%=RJ%+4:GOTO1850 1790 RJ%=RJ%+2:GOTO1850 1800 GOTO1850 1810 RJ%=RJ%-2:GOTO1850 1820 RJ%=RJ%-4:GOTO1850 1830 RJ%=RJ%-6:GOTO1850 1840 RJ%=ABS(RJ%-8) 1850 FOR X=1 TO 8:IF R1%(1,X)=RJ% THENTX$="1":GOTO1880 1860 NEXT X:FOR X=1 TO 8:IF R2%(1,X)=RJ% THENTX$="2":GOTO1880 1870 NEXT X:TX$="3" 1880 M$=TX$ 1890 LM$=L$+M$ 1900 IF (C5/2)=INT(C5/2) OR C5=0 THENTWR$(2)=TX$:GOTO1970 1910 IF LM$="12" THENTWR$(2)="3":GOTO1970 1920 IF LM$="13" THENTWR$(2)="2":GOTO1970 1930 IF LM$="23" THENTWR$(2)="1":GOTO1970 1940 IF LM$="21" THENTWR$(2)="3":GOTO1970 1950 IF LM$="31" THENTWR$(2)="2":GOTO1970 1960 IF LM$="32" THENTWR$(2)="1" 1970 L$="":M$="":LM$="":CT=FRE(0):GOTO350 1980 REM - BUILD SPRITES 1990 V=53248:POKEV+21,255:POKEV+23,255:POKEV+29,255 2000 POKE2040,192:POKE2041,193:POKE2042,194:POKE2043,195:POKE2044,196 2010 POKE2045,197:POKE2046,198:POKE2047,199 2020 POKEV+39,3:POKEV+40,15:POKEV+41,13:POKEV+42,9:POKEV+43,14:POKEV+44,5 2030 POKE V+45,8:POKEV+46,0 2040 RESTORE:N0=12288:FOR X=1 TO 8:FOR N=0 TO 62:READ Q:POKE N0+N,Q:NEXT N 2050 N0=N0+64:NEXT X 2060 T1$="11111111":T2$="00000000":T3$="00000000" 2070 FOR X=1 TO 8:T4$(X)=MID$(T1$,X,1):NEXT X 2080 FOR X=1 TO 8:T5$(X)=MID$(T2$,X,1):NEXT X 2090 FOR X=1 TO 8:T6$(X)=MID$(T3$,X,1):NEXT X 2100 Z%=97:FOR X=1 TO 8:T1(X)=Z%:T2(X)=Z%:T3(X)=Z%:Z%=Z%+9:NEXT X 2110 Y%=0:FOR X=1 TO 8:R1%(1,X)=Y%:Y%=Y%+1:NEXT X 2120 FOR X=1 TO 8:R2%(1,X)=9:R3%(1,X)=9:NEXT X 2130 IF YN$="Y" THEN140 2140 GOTO90 2150 REM - BUILD CHARACTER GRAPHICS 2160 BLK$=CHR$(144):RED$=CHR$(28):YEL$=CHR$(158):B2LU$=CHR$(31):CY$=CHR$(159) 2170 G1REY$="[151]":G2REY$="[152]":REM - C=(4); C=(5) 2180 RV$=CHR$(18):RO$=CHR$(146) 2190 CL$=CHR$(147):DW$=CHR$(17):LF$=CHR$(157) 2200 FOR X=1 TO 24:DO$=DO$+DW$:NEXT X:DO$=CHR$(19)+DO$ 2210 A$(1)=RV$+B2$+" "+RO$ 2220 A$(2)=RV$+YEL$+" "+DW$+LF$ 2230 FOR X=1 TO 10:A$(3)=A$(3)+A$(2):NEXT X 2240 A$(3)=A$(3)+" "+RO$ 2250 HDG$=RV$+WH$+"TOWERS OF HANOI"+RO$ 2260 NUM$=RV$+B2$+"NUMBER OF RINGS (2 - 8)"+RO$ 2270 SP$=" " 2280 F9$=RV$+G1$+"FROM TOWER #"+RO$:T9$=RV$+G1$+"TO TOWER #"+RO$ 2290 CR$=RV$+CY$+" "+RO$ 2300 SLV$(1)=RV$+G2$+" RINGS REQUIRES"+RO$:SLV$(2)=RV$+G2$+" MOVES."+RO$ 2310 MV$=RV$+B2$+"MOVE #"+RO$ 2320 CMP$=RV$+G1$+"COMPUTER SOLUTION (Y/N) ?"+RO$ 2330 EN$=RV$+G1$+"PRESS TO END"+RO$ 2340 GOTO1990 2350 REM - DATA FOR SPRITES 2360 REM - SPRITE 0 2370 DATA ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:REM 53 COMMAS 2380 DATA 1,255,128,1,255,128,1,255,128 2390 REM - SPRITE 1 2400 DATA ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 2410 DATA 3,255,192,3,255,192,3,255,192 2420 REM - SPRITE 2 2430 DATA ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 2440 DATA 7,255,224,7,255,224,7,255,224 2450 REM - SPRITE 3 2460 DATA ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 2470 DATA 15,255,240,15,255,240,15,255,240 2480 REM - SPRITE 4 2490 DATA ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 2500 DATA 31,255,248,31,255,248,31,255,248 2510 REM - SPRITE 5 2520 DATA ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 2530 DATA 63,255,252,63,255,252,63,255,252 2540 REM - SPRITE 6 2550 DATA ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 2560 DATA 127,255,254,127,255,254,127,255,254 2570 REM - SPRITE 7 2580 DATA ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 2590 DATA 255,255,255,255,255,255,255,255,255